/**
 * JMS规范中的消息类型：TextMessage、MapMessage、ObjectMessage、BytesMessage和StreamMessage等五种
 * 1.建立ConnectionFactory工厂对象，需要填入用户名、密码、连接地址（一般使用默认，如果没有修改的话）
 * 2.创建一个Connection连接，并且调用Connection的start方法开启连接，Connection方法默认是关闭的
 * 3.创建Session会话(connection.createSession)，用于接收消息，参数1是是否启用事务，参数2是签收模式，一般设置为自动签收
 * 4.创建Destination主题(session.createTopic)，指的是一个客户端用来制定生产消息目标和消费消息来源的对象。在PTP的模式中，Destination被称作队列，在Pub/Sub模式中，Destination被称作主题（Topic）
 * 5.创建消息生产者MessageProducer(session.createProducer)
 * 6.设置MessageProducer的相关属性(如：producer.setDeliveryMode)
 * 7.创建消息内容TextMessage（session.createTextMessage），
 * 8.发送消息(producer.send--->ession.commit)
 * 9.释放资源producer.close、session.close、connection.close
 */
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class TopicSender {

    public static void main(String[] args) throws JMSException {
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        /*等效替换
        TopicConnection connection = null;
        TopicSession session = null;
        TopicPublisher producer = null*/
        try {
            // 1、创建一个连接工厂对象，需要指定服务的ip及端口。
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            // 2、使用工厂对象创建一个Connection对象。
           connection = connectionFactory.createConnection();
            // 3、开启连接，调用Connection对象的start方法。
            connection.start();
            // 4、创建一个Session对象。
            // 第一个参数：是否开启事务。如果true开启事务，第二个参数无意义。一般不开启事务false。
            // 第二个参数：应答模式。自动应答或者手动应答。一般自动应答。
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // 5、使用Session对象创建一个Destination对象。两种形式queue、topic，现在应该使用topic
            Topic topic = session.createTopic("mytopic");
            // 6、使用Session对象创建一个Producer对象。
            producer = session.createProducer(topic);
            /*等效替换
            TopicConnectionFactory factory = new  ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
            connection = factory.createTopicConnection();
            connection.start();
            session = connection.createTopicSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            Topic topic = session.createTopic("mytopic");
            producer = session.createPublisher(topic);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
             */
            // 7、创建一个Message对象，可以使用TextMessage。
            for (int i = 0; i < 10; i++) {
                TextMessage textMessage = session.createTextMessage("第" + i + "个Topic消息");
                // 8、发送消息
                producer.send(textMessage);
            }
            session.commit();
        } catch (Exception e) {
        throw e;
    } finally {
        //9. 关闭释放资源
            if (producer != null) {
                producer.close();
            }
        if (session != null) {
            session.close();
        }
        if (connection != null) {
            connection.close();
        }
    }

    }
}
